package anji.plus.system.mark.service.impl;

import anji.plus.system.mark.base.BaseServiceImpl;
import anji.plus.system.mark.domain.AccountRecord;
import anji.plus.system.mark.dto.RankInfo;
import anji.plus.system.mark.dto.Record;
import anji.plus.system.mark.exception.BusinessException;
import anji.plus.system.mark.mapper.AccountRecordMapper;
import anji.plus.system.mark.service.IAccountRecordService;
import anji.plus.system.mark.vo.DateRecords;
import anji.plus.system.mark.vo.RecordItem;
import anji.plus.system.mark.vo.TaskListNode;
import anji.plus.system.mark.vo.TotalRecords;
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.*;


/**
 * <p>
 * 系统用户表 服务实现类
 * </p>
 *
 * @author luwei
 * @since 2023-11-08
 */
@Service
public class AccountRecordServiceImpl extends BaseServiceImpl<AccountRecordMapper, AccountRecord> implements IAccountRecordService {

    @Resource
    private AccountRecordMapper accountRecordMapper;

    private static long[] ls = new long[3000];
    private static int li = 0;


    //新增资金池记录
    @Transactional(rollbackFor = Exception.class)
    @Override
    public AccountRecord addRecord(AccountRecord accountRecord) {

        if(accountRecord == null){
            throw new BusinessException("参数不能为空");
        }else if(StrUtil.isEmpty(accountRecord.getRecordDescribe())){
            throw new BusinessException("任务描述不能为空");
        }else if(StrUtil.isEmpty(String.valueOf(accountRecord.getRecordAmount()))){
            throw new BusinessException("任务金额不能为空");
        }
        Record record = new Record();
        record.setId(getPK());
        record.setRecordType(Integer.valueOf(accountRecord.getRecordType()));
        record.setRecordUseType(accountRecord.getRecordUseType());
        record.setRecordDescribe(accountRecord.getRecordDescribe());
        record.setRecordAmount(accountRecord.getRecordAmount());
        record.setOperator("陈建明");

        accountRecordMapper.addRecord(record);

//        System.out.println("***********************************");
//        System.out.println(record);
//        System.out.println("***********************************");
        return null;
    }


    @Override
    public List<AccountRecord> queryAccountRecordList(String recordType) {
        return accountRecordMapper.queryAccountRecordList(recordType);
    }

    @Override
    public List<TotalRecords> queryTotalRecords(String recordType) {
        List<TotalRecords> totalRecords = new ArrayList<>();
        List<String> date = accountRecordMapper.queryDateList();
        System.out.println("**************");
        System.out.println(date.get(0));
        System.out.println("**************");
//        System.out.println("***********************************");
//        date.forEach(item -> System.out.println(item));
//        System.out.println("***********************************");

        if (recordType.equals("0")){
        for(int k=0; k < date.size(); k++){

            //   新增子节点，设置日期，总支出，总收入；
            DateRecords dateRecords = new DateRecords();

            DateTimeFormatter DATEFORMATTER1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

            DateTimeFormatter DATEFORMATTER = new DateTimeFormatterBuilder().append(DATEFORMATTER1)
                    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                    .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                    .toFormatter();

            //DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            LocalDateTime ldt = LocalDateTime.parse(date.get(k), DATEFORMATTER);

            dateRecords.setCreateTime(ldt);

            dateRecords.setExp(0.00);

            dateRecords.setIncome(accountRecordMapper.queryIncome(date.get(k),recordType));
            //新增设置叶节点,SQL查询赋值；
            dateRecords.setNodeList(accountRecordMapper.queryDateRecord(date.get(k),recordType));
            //输出类循环添加封装对象；
            totalRecords.add(dateRecords);
        }
        }else if(recordType.equals("1")){
            for(int k=0; k < date.size(); k++){

                //   新增子节点，设置日期，总支出，总收入；
                DateRecords dateRecords = new DateRecords();

                DateTimeFormatter DATEFORMATTER1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

                DateTimeFormatter DATEFORMATTER = new DateTimeFormatterBuilder().append(DATEFORMATTER1)
                        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                        .toFormatter();

                //DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                LocalDateTime ldt = LocalDateTime.parse(date.get(k), DATEFORMATTER);
                dateRecords.setCreateTime(ldt);

                dateRecords.setExp(accountRecordMapper.queryExp(date.get(k),recordType));

                dateRecords.setIncome(0.00);
                //新增设置叶节点,SQL查询赋值；
                dateRecords.setNodeList(accountRecordMapper.queryDateRecord(date.get(k),recordType));
                //输出类循环添加封装对象；
                totalRecords.add(dateRecords);
             }

        }else{
            for(int k=0; k < date.size(); k++){

                //   新增子节点，设置日期，总支出，总收入；
                DateRecords dateRecords = new DateRecords();

                DateTimeFormatter DATEFORMATTER1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

                DateTimeFormatter DATEFORMATTER = new DateTimeFormatterBuilder().append(DATEFORMATTER1)
                        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                        .toFormatter();

                //DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                LocalDateTime ldt = LocalDateTime.parse(date.get(k), DATEFORMATTER);
                dateRecords.setCreateTime(ldt);

                dateRecords.setExp(accountRecordMapper.queryExp(date.get(k), "1"));

                dateRecords.setIncome(accountRecordMapper.queryIncome(date.get(k),"0"));
                //新增设置叶节点,SQL查询赋值；
                dateRecords.setNodeList(accountRecordMapper.queryDateRecord(date.get(k),recordType));
                //输出类循环添加封装对象；
                totalRecords.add(dateRecords);
            }

        }

        return totalRecords;
    }


    /**
     * @Title: getPK
     * @Description: 主键生成方法，生成Long型的数字主键
     * @return long 返回long 主键内容
     * @author: 温泉
     * @date 2012-08-02 09:56:37 +0800
     */
    public synchronized static long getPK() {
        /*
         * 2012-10-18 苏沫予： 修改主键生成算法，使主键在软件生命周期内具有时间连续性同时适应JS
         * 前端应用，根据当前算法，至少17年内不会发生2^53溢出问题 - 关于性能问题：
         * 新主键方案每10毫秒内有十万分之一的可能性会发生冲突主键问题，因此
         * 当系统每秒数据生成量达到100条时生成器实际性能大约下降0.003%，此
         * 后呈线性下降，每秒数据生成量150000条时，主键生成性能大约下降一倍， 每秒生成数据超过300000条后，该主键生成算法将不再安全 -
         * 关于并发问题： 该算法并发运行时（例如分布式服务器系统）存在每秒千万分之一的冲突
         * 可能性，因此建议不用于并发式系统，即便投入应用，也应当保证每秒并 发插入数据不超过1000条。
         */
        String a = String.valueOf((System.currentTimeMillis() / 10L) % 100000000000L);
        String d = (String.valueOf((1 + Math.random()) * 100000)).substring(1, 6);
        // 苏沫予：添加代码结束（同时移除韩欣宇的代码方案）
        long lo = Long.parseLong(a + d);
        for (int i = 0; i < 3000; i++) {
            long lt = ls[i];
            if (lt == lo) {
                lo = getPK();
                break;
            }
        }
        ls[li] = lo;
        li++;
        if (li == 3000) {
            li = 0;
        }
        return lo;
    }
}
